package com.ldn.server.mqtt.config;

import org.dromara.mica.mqtt.codec.MqttPublishMessage;
import org.dromara.mica.mqtt.codec.MqttQoS;
import org.tio.core.ChannelContext;

/**
 * 多分支相关处理接口
 *
 * @author 李大牛家的牛 (scafel@163.com)
 * @product serverless
 * @className CovertType
 * @createDate 2025/2/25 - 14:06
 * @description 多分支相关处理接口
 **/
public interface CovertType {

    /**
     * 验证用户名密码是否可登录
     *
     * @param uniqueId 客户端ID
     * @param userName 登录用户名 账号规则
     *                 <p>
     *                     设备 'EQUIPMENT-'+ 设备编号<br>
     *                     会员 'MEMBER-'+ 会员编号
     *                 </p>
     * @param password 登录密码 对应表字段enId
     * @return
     */
    boolean checkAuthenticate(String uniqueId, String userName, String password);

    /**
     * 消息处理 接收消息
     *
     * @param context Mqtt服务端上下文 包含客户端信息、服务器信息、配置信息、线程信息等
     * @param clientId 客户端ID
     * @param topic 发送端主题
     * @param qoS QoS等级
     * @param message 发送端消息
     */
    void messageHandler(ChannelContext context, String clientId, String topic, MqttQoS qoS, MqttPublishMessage message);

    /**
     * 客户端上线
     *
     * @param context Mqtt服务端上下文 包含客户端信息、服务器信息、配置信息、线程信息等
     * @param clientId 客户端ID
     * @param username 登录用户名
     */
    void online(ChannelContext context, String clientId, String username);

    /**
     * 客户端下线
     *
     * @param context Mqtt服务端上下文 包含客户端信息、服务器信息、配置信息、线程信息等
     * @param clientId 客户端ID
     * @param username 登录用户名
     * @param reason 离线遗嘱消息
     */
    void offline(ChannelContext context, String clientId, String username, String reason);

    /**
     * 验证客户端是否可以订阅主题
     *
     * @param clientId 客户端ID
     * @param topicFilter 订阅主题
     * @return true：可以订阅 false：不可以订阅
     */
    boolean checkCanSubTopic(String clientId, String topicFilter);

    /**
     * 获取标签 标记
     *
     * @return 标签标记
     */
    String getTag();

    /**
     * 订阅主题通知
     *
     * @param context Mqtt服务端上下文 包含客户端信息、服务器信息、配置信息、线程信息等
     * @param clientId 客户端ID
     * @param topicFilter 订阅主题
     * @param qos QoS等级
     */
    void onSubscribed(ChannelContext context, String clientId, String topicFilter, int qos);
    /**
     * 取消订阅主题通知
     *
     * @param context Mqtt服务端上下文 包含客户端信息、服务器信息、配置信息、线程信息等
     * @param clientId 客户端ID
     * @param topicFilter 取消订阅主题
     */
    void onUnsubscribed(ChannelContext context, String clientId, String topicFilter);
    /**
     * 验证客户端是否可以发布消息
     *
     * @param clientId 客户端ID
     * @param topicFilter 发布主题
     * @param value QoS等级
     * @param isRetain 是否保留消息
     * @return true：可以发布 false：不可以发布
     */
    boolean checkCanPublish(String clientId, String topicFilter, int value, boolean isRetain);
}
